"""
1960-2019年全球GDP前8的国家
"""
from pyecharts.charts import Bar
from pyecharts.charts import Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType

# 处理文件
f = open(r"C:\Users\Lenovo\OneDrive\桌面\三种图的案例\1960-2019全球GDP数据.csv", "r", encoding="GB2312")
data_lines = f.readlines()
f.close()

# 处理数据
# 去除
data_lines.pop(0)
# 提取数据
data_dict = {}
for line in data_lines:
    parts = line.split(",")  # 只分割一次，复用 parts 列表
    year = int(parts[0])
    country = parts[1]
    GDP = float(parts[2])

    # 封装数据(注意是每一行处理一次)
    # 格式为 { 1960: [ [美国, 123], [中国,321], ......  ], 1961: [ [美国, 123], [中国,321], ......  ], ...... }
    # 字典里，年份为键，该年份所有国家的GDP列表为值，列表值里面单独封装着每一个国家的GDP(在循环外部创建空字典)
    try:
        data_dict[year].append([country, GDP])
    except KeyError:
        data_dict[year] = []
        data_dict[year].append([country, GDP])

# print(data_dict[1960])

# 生成图像(创建时间线)
# 获取时间线对象
timeline = Timeline({"theme": ThemeType.LIGHT})
# 添加数据
# 将字典中所有的键取出来排序（便于循环取数据）
sort_year_list = sorted(data_dict.keys())
# 取前八个国家的数据以构建柱状图
for year in sort_year_list:
    # 对每年的国家的GDP进行从大到小排序
    data_dict[year].sort(key=lambda element: element[1], reverse=True)
    # 取前八名
    year_data = data_dict[year][0:8]
    # 创建x、y轴空列表以存放数据
    x_data = []
    y_data = []
    # 放入数据
    for country_GDP in year_data:
        x_data.append(country_GDP[0])
        y_data.append(country_GDP[1] / 100000000)

    # 构建柱状图
    # 获取图像对象
    bar = Bar()
    # 降序
    x_data.reverse()
    y_data.reverse()
    # 添加数据
    bar.add_xaxis(x_data)
    bar.add_yaxis("GDP", y_data, label_opts=LabelOpts(position="right"))
    # 反转x、y轴
    bar.reversal_axis()
    # 设置每一年图表的标题
    bar.set_global_opts(
        title_opts=TitleOpts(title=f"{year}全球前8GDP")
    )
    # 将每个柱状图添加进时间线（每个点）
    timeline.add(bar, str(year))

# 设置时间线自动播放
timeline.add_schema(
    play_interval=300,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=True
)
# 绘图
timeline.render("1960-2019全球GDP前8国家.html")
